package com.hh.admin.controller;


import java.util.List;
import java.util.Map;

import javax.validation.Valid;

import org.hibernate.validator.constraints.NotBlank;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.hh.admin.entity.SysRole;
import com.hh.admin.exception.ValidEntityException;
import com.hh.admin.service.ISysRoleService;
import com.hh.admin.view.SysRoleView;
import com.hh.core.annotion.OperationLog;
import com.hh.core.common.BaseController;
import com.hh.core.entity.ResultEntity;
import com.hh.core.entity.ZtreeEntity;
import com.hh.core.enums.OperationLogEnum;
import com.hh.core.log.LogTempObject;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author hxn
 * @since 2018-01-16
 */
@Controller
@RequestMapping("/admin/sysRole")
public class SysRoleController extends BaseController{
	
	@Autowired
	ISysRoleService sysRoleService;
	
	/**
	 * 
	* @Title: role  
	* @Description:   角色名称页
	* @param @param model
	* @param @return    设定文件  
	* @return String    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:03:13  
	* @throws
	 */
	@RequestMapping(value = "", method = RequestMethod.GET)
	public String role(Model model) {
		return SysRoleView.ROLE;
	}
	
	/**
	 * 
	* @Title: roleAdd  
	* @Description:   角色名称添加页
	* @param @param model
	* @param @return    设定文件  
	* @return String    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:03:30  
	* @throws
	 */
	@RequestMapping(value = "/add", method = RequestMethod.GET)
	public String roleAdd(Model model) {
		model.addAttribute("action", "add");
		return SysRoleView.ROLE_DETAIL;
	}
	
	/**
	 * 
	* @Title: addRole  
	* @Description:   角色名称添加
	* @param @param role
	* @param @param result
	* @param @return    设定文件  
	* @return ResultEntity    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:03:39  
	* @throws
	 */
	@RequestMapping(value = "/add", method = RequestMethod.POST)
	@ResponseBody
	@OperationLog(value="添加角色",type=OperationLogEnum.ADD)
	public ResultEntity addRole(@Valid SysRole role,BindingResult result){
		if (result.hasErrors()) {
			throw new ValidEntityException();
		}
		sysRoleService.insert(role);
		return successResult("添加成功!");
	}
	
	/**
	 * 
	* @Title: roleEdit  
	* @Description:   角色名称修改页
	* @param @param id
	* @param @param model
	* @param @return    设定文件  
	* @return String    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:03:49  
	* @throws
	 */
	@RequestMapping(value = "/edit/{id}", method = RequestMethod.GET)
	public String roleEdit(@PathVariable Long id, Model model) {
		SysRole role = sysRoleService.selectById(id);
		model.addAttribute("action", "edit");
		model.addAttribute("role", role);
		
		LogTempObject.me().setObject(role);
		return SysRoleView.ROLE_DETAIL;
	}
	
	/**
	 * 
	* @Title: editRole  
	* @Description:   角色名称修改
	* @param @param role
	* @param @param result
	* @param @return    设定文件  
	* @return ResultEntity    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:04:01  
	* @throws
	 */
	@RequestMapping(value = "/edit", method = RequestMethod.POST)
	@ResponseBody
	@OperationLog(value="修改角色",type=OperationLogEnum.EDIT)
	public ResultEntity editRole(@Valid SysRole role,BindingResult result){
		if (result.hasErrors()) {
			throw new ValidEntityException();
		}
		sysRoleService.updateById(role);
		return successResult("修改成功!");
	}
	
	/**
	 * 
	* @Title: deleteRole  
	* @Description:   角色名称删除
	* @param @param id
	* @param @return    设定文件  
	* @return ResultEntity    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:04:12  
	* @throws
	 */
	@RequestMapping(value = "/delete", method = RequestMethod.POST)
	@ResponseBody
	@OperationLog(value="删除角色",type=OperationLogEnum.DELETE)
	public ResultEntity deleteRole(@NotBlank(message = "ID不能为空") Long id) {
		sysRoleService.deleteById(id);
		return successResult("删除成功!");
	}
	
	/**
	 * 
	* @Title: roleList  
	* @Description:   角色名称分页列表
	* @param @param pageSize
	* @param @param pageNumber
	* @param @return    设定文件  
	* @return JSONObject    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:04:20  
	* @throws
	 */
	@ResponseBody
	@RequestMapping(value = "/list", method = RequestMethod.POST)
	public JSONObject roleList(int pageSize, int pageNumber,String roleName) {
		Page<SysRole> page = new Page<SysRole>();
		page.setSize(pageSize);
		page.setCurrent(pageNumber);
		EntityWrapper<SysRole> entityWrapper = new EntityWrapper<>();
		entityWrapper.like("ROLE_NAME", roleName);
		sysRoleService.selectPage(page,entityWrapper);
		return pageJosn(page);
	}
	
	/**
	 * 
	* @Title: roleMenu  
	* @Description:   权限分配页面 
	* @param @param id
	* @param @param model
	* @param @return    设定文件  
	* @return String    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午10:57:26  
	* @throws
	 */
	@RequestMapping(value = "/menu/{id}", method = RequestMethod.GET)
	public String roleMenu(@PathVariable Long id, Model model) {
		SysRole role = sysRoleService.selectById(id);
		model.addAttribute("id", role.getId());
		model.addAttribute("name", role.getRoleName());
		return SysRoleView.ROLE_MENU;
	}
	
	/**
	 * 
	* @Title: menuRole  
	* @Description:   分配权限
	* @param @param id
	* @param @param menuIds
	* @param @return    设定文件  
	* @return ResultEntity    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午11:00:57  
	* @throws
	 */
	@RequestMapping(value = "/menu", method = RequestMethod.POST)
	@ResponseBody
	@OperationLog(value="分配权限",type=OperationLogEnum.EDIT,paramIndex={0,1})
	public ResultEntity menuRole(Long id,String menuIds){
		if(StrUtil.isBlank(menuIds) || ObjectUtil.isNull(id)){
			throw new ValidEntityException();
		}
		sysRoleService.addRoleMenu(id, menuIds);
		return successResult("分配权限成功!");
	}
	
	/**
	 * 
	* @Title: menuTree  
	* @Description:   角色权限树
	* @param @param id
	* @param @return    设定文件  
	* @return List<ZtreeEntity>    返回类型  
	* @author hxn
	* @date 2018年2月7日 上午11:03:02  
	* @throws
	 */
	@SuppressWarnings("unchecked")
	@RequestMapping(value = "/menuTreeById/{id}", method = RequestMethod.POST)
	@ResponseBody
	public List<ZtreeEntity> menuTree(@PathVariable Long id){
		Map<String,Object> map = sysRoleService.getTreeById(id);
		List<ZtreeEntity> treeList = (List<ZtreeEntity>)map.get("ztree");
		treeList.add(ZtreeEntity.getTopNode("总菜单"));
		LogTempObject.me().setObject(id,map.get("menuIds").toString());
		return treeList;
	}
}
